<section>
<h4>Scrapy初探</h4>
<p>Scrapy是一个应用程序框架，用于爬取网站并提取结构化的数据，这些数据有广泛的应用，例如数据挖掘，信息处理或历史归档。虽然Scrapy最初设计用于网页爬取，但它也可以用于使用API的数据爬取或作为一种通用的网络爬虫。
<p>一个爬虫示例</p>
<p>为了演示Scrapy的工作逻辑，我们将引导你通过一个Scrapy爬虫实例，使用最简单的方法来运行一个爬虫。下面是从网站<a class="reference external" href="http://quotes.toscrape.com">http://quotes.toscrape.com</a>爬出名言的爬虫代码，并跟踪页码:</p>
<pre>
import scrapyscrapy


class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = [
        'http://quotes.toscrape.com/tag/humor/',
    ]

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').extract_first(),
                'author': quote.xpath('span/small/text()').extract_first(),
            }

        next_page = response.css('li.next a::attr("href")').extract_first()
        if next_page is not None:
            next_page = response.urljoin(next_page)
            yield scrapy.Request(next_page, callback=self.parse)
</pre>
<p>新建文件quotes_spider.py，加入上述代码，使用runspider命令运行这个spider</p>
<p><code>scrapy runspider quotes_spider.py -o quotes.json</code></p>
<p>上面这条命令会生成一个quotes.json文件，其内容如下:</p>
<pre>
[{
    "author": "Jane Austen",
    "text": "The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid."
},
{
    "author": "Groucho Marx",
    "text": "Outside of a dog, a book is man's best friend. Inside of a dog it's too dark to read."
},
{
    "author": "Steve Martin",
    "text": "A day without sunshine is like, you know, night."
},
...]
</pre>
<p>原理解释:</p>
<p>当你运行命令<code>scrapy runspider quotes_spider.py</code>时，Scrapy寻找它里面的Spider定义并通过它的爬虫引擎运行它。爬虫通过发出请求到start_urls属性中定义的URL（在本例中，仅仅是humor类别中的quotes的URL）并调用默认的回调方法parse，并将response对象作为参数传递给parse。在parse回调中，我们使用一个CSS Selector循环得到的所有的名言名句，产生一个带有提取好的名言文本和作者的Python字典，寻找下一个页面的链接并且安排另一个请求使用相同的parse方法作为回调函数。</p>
<p>这里注意：Scrapy的主要有点之一︰请求是以异步方式调度和处理的。这意味着Scrapy不需要等待请求完成和处理就可以发送另一个请求，或同时做其他事情。这也意味着其他请求可以继续走下去，即使处理它时有一些请求失败或有错误发生。这样做可以使爬虫拥有很好的性能。Scrapy还提供几个设置给你控制爬虫的速率。你可以设置每个请求之间下载的延迟，限制每个域名或每个IP并发请求的数量，甚至使用自动节流扩展来自动得设置这些参数的值</p>
<p>还有什么</p>
<p>到这里，你已经了解了如何通过Scrapy提取并存储网页中的信息，但这仅仅只是冰山一角。 Scrapy提供很多强大的功能使得爬取轻松且高效，比如︰</p>
<ul>
    <li>内置支持使用的扩展的CSS选择器和XPath表达式从HTML/XML选择和提取数据，支持使用正则表达式和辅助方法来提取</li>
    <li>提供一个交互式shell控制台(可用于IPython), 可用于测试CSS和XPath表达式，当编写或调试spider时非常有用</li>
    <li>内置支持把数据导出为多种格式(JSON, CSV, XML)的文件以及将其存储在多个后端（FTP，S3，本地文件系统)</li>
    <li>针对非英语语系中不标准或者错误的编码声明, 提供了自动检测以及健壮的编码支持</li>
    <li>强大的可扩展性支持，允许你使用信号和定义良好的API（中间件、扩展和管道）插入自己的功能。</li>
    <ul>
        <li>cookies和session 处理</li>
        <li>http压缩</li>
        <li>user-agent spoofing</li>
        <li>robots.txt</li>
        <li>爬取深度限制</li>
    </ul>
    <li>一个Telnet控制台，可以用来调试爬虫</li>
</ul>
</section>